using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using Studio7i.Dominio;

namespace Studio7i.Persistencia
{
    public class ClienteDAO : IClienteDAO
    {


        // Métodos CRUD
        public Cliente Crear(Cliente clienteACrear)
        {
            string _Sentencia = "INSERT INTO Cliente(CodUser,NombreUsuario,Clave,DNI,Nombres,Apellidos,Email,FechaNac) VALUES(@CodUser,@NombreUsuario,@Clave,@DNI,@Nombres,@Apellidos,@Email,@FechaNac)";

            int _NuevoCodigo = GenerarNuevoCodigo();
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    _Comando.Parameters.Add(new SqlParameter("@CodUser", _NuevoCodigo));
                    _Comando.Parameters.Add(new SqlParameter("@NombreUsuario", clienteACrear.NombreUsuario));
                    _Comando.Parameters.Add(new SqlParameter("@Clave", clienteACrear.Clave));
                    _Comando.Parameters.Add(new SqlParameter("@DNI", clienteACrear.DNI));
                    _Comando.Parameters.Add(new SqlParameter("@Nombres", clienteACrear.Nombres));
                    _Comando.Parameters.Add(new SqlParameter("@Apellidos", clienteACrear.Apellidos));
                    _Comando.Parameters.Add(new SqlParameter("@Email", clienteACrear.Email));
                    _Comando.Parameters.Add(new SqlParameter("@FechaNac", clienteACrear.FechaNac));
                    _Comando.ExecuteNonQuery();
                }
            }
            return Obtener(_NuevoCodigo);
        }
        public Cliente Obtener(int codigo)
        {
            string _Sentencia = "SELECT CodUser,NombreUsuario,Clave,DNI,Nombres,Apellidos,Email,FechaNac FROM Cliente WHERE CodUser=@codigo";
            Cliente clienteCreado = null;
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    _Comando.Parameters.Add(new SqlParameter("@codigo", codigo));
                    using (SqlDataReader _Resultado = _Comando.ExecuteReader())
                    {
                        if (_Resultado.Read())
                        {
                            clienteCreado = new Cliente();
                            clienteCreado.CodUser = _Resultado.GetInt32(0);
                            clienteCreado.NombreUsuario = _Resultado.GetString(1);
                            clienteCreado.Clave = (String)_Resultado["Clave"];
                            clienteCreado.DNI = (String)_Resultado["DNI"];
                            clienteCreado.Nombres = (String)_Resultado["Nombres"];
                            clienteCreado.Apellidos = (String)_Resultado["Apellidos"];
                            clienteCreado.Email = (String)_Resultado["Email"];
                            clienteCreado.FechaNac = (DateTime)_Resultado["FechaNac"];

                        }
                    }
                }
            }
            return clienteCreado;
        }
        public Cliente Modificar(Cliente clienteAModificar)
        {
            string _Sentencia = "UPDATE Cliente SET NombreUsuario=@NombreUusario,Clave=@Clave,DNI=@DNI,Nombres=@Nombres,Apellidos=@Apellidos,Email=@Email,FechaNac=@FechaNac  WHERE CodUser=@codigo";
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    _Comando.Parameters.Add(new SqlParameter("@codigo", clienteAModificar.CodUser));
                    _Comando.Parameters.Add(new SqlParameter("@NombreUusario", clienteAModificar.NombreUsuario));
                    _Comando.Parameters.Add(new SqlParameter("@Clave", clienteAModificar.Clave));
                    _Comando.Parameters.Add(new SqlParameter("@DNI", clienteAModificar.DNI));
                    _Comando.Parameters.Add(new SqlParameter("@Nombres", clienteAModificar.Nombres));
                    _Comando.Parameters.Add(new SqlParameter("@Apellidos", clienteAModificar.Apellidos));
                    _Comando.Parameters.Add(new SqlParameter("@Email", clienteAModificar.Email));
                    _Comando.Parameters.Add(new SqlParameter("@FechaNac", clienteAModificar.FechaNac));
                    _Comando.ExecuteNonQuery();
                }
            }
            return Obtener(clienteAModificar.CodUser);
        }
        public void Eliminar(Cliente clienteAEliminar)
        {
            string _Sentencia = "DELETE FROM Cliente WHERE CodUser=@codigo";
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    _Comando.Parameters.Add(new SqlParameter("@codigo", clienteAEliminar.CodUser));
                    _Comando.ExecuteNonQuery();
                }
            }
        }

        // Métodos Listar
        public ICollection<Cliente> ListarTodos()
        {
            string _Sentencia = "SELECT CodUser,NombreUsuario,Clave,DNI,Nombres,Apellidos,Email,FechaNac FROM Cliente";
            ICollection<Cliente> clientesEncontrados = new List<Cliente>();
            Cliente clienteEncontrado = new Cliente();
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    using (SqlDataReader _Resultado = _Comando.ExecuteReader())
                    {
                        while (_Resultado.Read())
                        {
                            clienteEncontrado = new Cliente();
                            clienteEncontrado.CodUser = _Resultado.GetInt32(0);
                            clienteEncontrado.NombreUsuario = _Resultado.GetString(1);
                            clienteEncontrado.Clave = (String)_Resultado["Clave"];
                            clienteEncontrado.DNI = (String)_Resultado["DNI"];
                            clienteEncontrado.Nombres = (String)_Resultado["Nombres"];
                            clienteEncontrado.Apellidos = (String)_Resultado["Apellidos"];
                            clienteEncontrado.Email = (String)_Resultado["Email"];
                            if (DBNull.Value.Equals(_Resultado["FechaNac"])) // No hay datos en la tabla

                                clienteEncontrado.FechaNac = DateTime.ParseExact("01-01-1900", "dd-MM-yyyy", null);

                            else
                                clienteEncontrado.FechaNac = (DateTime)_Resultado["FechaNac"];

                            clientesEncontrados.Add(clienteEncontrado);
                        }
                    }
                }
            }
            return clientesEncontrados;
        }

        public ICollection<Cliente> ListarXNombre(string nombre)
        {
            string _Sentencia = "SELECT CodUser,NombreUsuario,Clave,DNI,Nombres,Apellidos,Email,FechaNac FROM Cliente WHERE Nombres LIKE '%'+@nombre+'%'";
            ICollection<Cliente> clientesEncontrados = new List<Cliente>();
            Cliente clienteEncontrado = null;
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    _Comando.Parameters.Add(new SqlParameter("@nombre", nombre));
                    using (SqlDataReader _Resultado = _Comando.ExecuteReader())
                    {
                        while (_Resultado.Read())
                        {
                            clienteEncontrado = new Cliente();
                            clienteEncontrado.CodUser = _Resultado.GetInt32(0);
                            clienteEncontrado.NombreUsuario = _Resultado.GetString(1);
                            clienteEncontrado.Clave = (String)_Resultado["Clave"];
                            clienteEncontrado.DNI = (String)_Resultado["DNI"];
                            clienteEncontrado.Nombres = (String)_Resultado["Nombres"];
                            clienteEncontrado.Apellidos = (String)_Resultado["Apellidos"];
                            clienteEncontrado.Email = (String)_Resultado["Email"];
                            clienteEncontrado.FechaNac = (DateTime)_Resultado["FechaNac"];
                            clientesEncontrados.Add(clienteEncontrado);
                        }
                    }
                }
            }
            return clientesEncontrados;
        }

        public ICollection<Cliente> ListarXBusqueda(int? codigo, string nombreUsuario, string DNI, string Nombres, string Apellidos,string eMail)
        {
            string _Sentencia = @"SELECT CodUser,NombreUsuario,Clave,DNI,Nombres,Apellidos,Email,FechaNac FROM Cliente WHERE 1=1";

            ICollection<Cliente> clientesEncontrados = new List<Cliente>();
            Cliente clienteEncontrado = null;
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand())
                {
                    if (codigo != null)
                    {
                        _Sentencia = _Sentencia + " AND CodUser=@codigo";
                        _Comando.Parameters.Add(new SqlParameter("@codigo", codigo));
                    }
                    if (nombreUsuario != null)
                    {
                        _Sentencia = _Sentencia + " AND NombreUsuario LIKE '%'+@nombreUsuario+'%'";
                        _Comando.Parameters.Add(new SqlParameter("@nombreUsuario", nombreUsuario));
                    }
                    if (DNI != null)
                    {
                        _Sentencia = _Sentencia + " AND DNI LIKE '%'+@DNI+'%'";
                        _Comando.Parameters.Add(new SqlParameter("@DNI", DNI));
                    }
                    if (Nombres != null)
                    {
                        _Sentencia = _Sentencia + " AND Nombres=@Nombres";
                        _Comando.Parameters.Add(new SqlParameter("@Nombres", Nombres));
                    }
                    if (Apellidos != null)
                    {
                        _Sentencia = _Sentencia + " AND Apellidos=@Apellidos";
                        _Comando.Parameters.Add(new SqlParameter("@Apellidos", Apellidos));
                    }
                    if (eMail != null)
                    {
                        _Sentencia = _Sentencia + " AND Email=@Email";
                        _Comando.Parameters.Add(new SqlParameter("@Email", eMail));
                    }

                    _Comando.CommandText = _Sentencia;
                    _Comando.Connection = _Conexion;
                    using (SqlDataReader _Resultado = _Comando.ExecuteReader())
                    {
                        while (_Resultado.Read())
                        {
                            clienteEncontrado = new Cliente();
                            clienteEncontrado.CodUser = _Resultado.GetInt32(0);
                            clienteEncontrado.NombreUsuario = _Resultado.GetString(1);
                            clienteEncontrado.Clave = (String)_Resultado["Clave"];
                            clienteEncontrado.DNI = (String)_Resultado["DNI"];
                            clienteEncontrado.Nombres = (String)_Resultado["Nombres"];
                            clienteEncontrado.Apellidos = (String)_Resultado["Apellidos"];
                            clienteEncontrado.Email = (String)_Resultado["Email"];
                            if (DBNull.Value.Equals(_Resultado["FechaNac"])) // No hay datos en la tabla
                                clienteEncontrado.FechaNac = DateTime.ParseExact("01-01-1900", "dd-MM-yyyy", null);
                            else
                                clienteEncontrado.FechaNac = (DateTime)_Resultado["FechaNac"];

                            clientesEncontrados.Add(clienteEncontrado);
                        }
                    }
                }
            }
            return clientesEncontrados;
        }
        // Métodos de soporte*/
        private int GenerarNuevoCodigo()
        {
            string _Sentencia = "SELECT max(CodUser) FROM Cliente";
            int _NuevoCodigo = 0;
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    object _Resultado = _Comando.ExecuteScalar();
                    if (DBNull.Value.Equals(_Resultado)) // No hay datos en la tabla
                        _NuevoCodigo = 1;
                    else
                        _NuevoCodigo = (int)_Resultado + 1;
                }
            }
            return _NuevoCodigo;
        }
    }
}
